// 反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。

// 说明:
// 1 ≤ m ≤ n ≤ 链表长度。


// 示例:
// 输入: 1->2->3->4->5->NULL, m = 2, n = 4
// 输出: 1->4->3->2->5->NULL


/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} head
 * @param {number} m
 * @param {number} n
 * @return {ListNode}
 */
//  reverseBetween递归函数的定义时，翻转以head为头节点的链表的第m到第n个节点，返回更新后的头节点
var reverseBetween = function (head, m, n) {
  // 当从head开始翻转，区间为[1,n]时使用的方法
  let reverse = function reverse(root, distance) {
    if (distance === 1) {
      successor = root.next;
      return root;
    }
    let p = reverse(root.next, distance - 1);
    root.next.next = root;
    root.next = successor;
    return p;
  }
  if (m === 1) {
    let successor = null;
    return reverse(head, n);
  } else {
    head.next = reverseBetween(head.next, m - 1, n - 1);
    return head;
  }
};